/******************************************************************************* 
  Copyright (C), 1988-2020, zeno Tech. Co., Ltd.
  Description:     配置模块,统一管理设备的配置信息，
                   向上层(包括boot、内核、应用)提供配置信息获取接口.
  Function List:   
     CFG_Init()     //内核态不需要调用
         |
         |
        \ /
    CFG_GetItem()  //获取根结点
         |
         |
        \ / 
    cJSON标准处理函数 //由于内核态不支持浮点运算，部分cJSON标准处理函数无法使用
         |
         |
        \ /            
    cJSON_Delete()  //对于应用层，从概结点查找返回的pJson
         |          //需要调用cJSON_Delete()释放。
         |
        \ /
    CFG_Exit()      //内核态不需要调用
*******************************************************************************/
#ifndef CFG_H 
#define CFG_H 

#ifdef __cplusplus
extern "C" {
#endif

/*=============================================================================
                                 Includes                                  
==============================================================================*/
#include <cJSON.h>
#include <cfgComm.h>


/*=============================================================================
                               Macro Definition
==============================================================================*/
#define CFG_PRODUCT_ITEM         "product"            /* 生产信息配置项名 */

                        
/*=============================================================================
                        Local Structures and Typedef 
==============================================================================*/
#ifdef __HuaweiLite__

/* 配置模块初始化参数 */
typedef struct
{
    unsigned int tagAddr;       /* tags的启始地址 */
    int reserved[63];
} CFG_initPrm_t;

#endif

/*=============================================================================
                             extern  Variables                                  
==============================================================================*/


/*=============================================================================
                             Function Definition                                  
==============================================================================*/ 
/*******************************************************************************
  Function:     CFG_GetItem 
  Description:  获取配置项
  Input:        - pJson: 配置查找的起始结点，
                  pJson == NULL 从配置根结点开始查找。对于应用层，从概结点查找
                                返回的pJson需要调用cJSON_Delete()释放。
                  pJson != NULL 从该结点开始查找。
                - pStr: 要查找的结点，父结点与子结点通过.隔开。
  Output:       无
  Return:       NULL: 操作失败
                ~NULL: 获取的配置项 
  Others:       无
*******************************************************************************/
cJSON *CFG_GetItem(cJSON *pJson, char *pStr);


/*******************************************************************************
  Function:     CFG_EnvGet
  Description:  读取Env配置参数
  Input:        - pKey: 参数名
                - len: 缓存长度
  Output:       - pValue: 参数值缓存
  Return:       0: 成功
                ~0: 失败
  Others:       无
*******************************************************************************/ 
int CFG_EnvGet(char *pKey, char *pValue, unsigned int len);


/*******************************************************************************
  Function:     CFG_EnvSet
  Description:  配置Env配置参数
  Input:        - pKey: 参数名
                - pValue: 参数值
  Output:       无
  Return:       0: 成功
                ~0: 失败
  Others:       无
*******************************************************************************/ 
int CFG_EnvSet(char *pKey, char *pValue);


#if defined __HuaweiLite__ || !(defined __KERNEL__)

#ifdef __HuaweiLite__
/*******************************************************************************
  Function:     CFG_Init
  Description:  配置模块初始化
  Input:        - pInitPrm: 配置模块初始化参数
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/ 
int CFG_Init(CFG_initPrm_t *pInitPrm);
#else
/*******************************************************************************
  Function:     CFG_Init
  Description:  配置模块初始化
  Input:        无
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/ 
int CFG_Init(void);
#endif

/*******************************************************************************
  Function:     CFG_HwidGet
  Description:  读取Hwid配置参数
  Input:        无
  Output:       - pHwidInfo: hwid信息
  Return:       0: 成功
                ~0: 失败
  Others:       无
*******************************************************************************/ 
int CFG_HwidGet(CFG_hwidInfo_t *pHwidInfo);

/*******************************************************************************
  Function:     CFG_HwidSet
  Description:  配置Hwid配置参数
  Input:        - pHwidInfo: hwid信息
  Output:       无
  Return:       0: 成功
                ~0: 失败
  Others:       无
*******************************************************************************/ 
int CFG_HwidSet(CFG_hwidInfo_t *pHwidInfo);


/*******************************************************************************
  Function:     CFG_EncHwidSet
  Description:  配置加密过的hwid信息
  Input:        - pEncHwid: 加密过的hwid信息
  Output:       无
  Return:       0: 成功
                ~0: 失败
  Others:       无
*******************************************************************************/ 
int CFG_EncHwidSet(char *pEncHwid);


/*******************************************************************************
  Function:     CFG_GetMtdsInfo
  Description:  解析分区表信息
  Input:        - pMtds: 分区表
  Output:       无
  Return:       字符串
  Others:       无
*******************************************************************************/ 
int CFG_GetMtdsInfo(CFG_mtds_t *pMtds);

/*******************************************************************************
  Function:     CFG_GetBootParam
  Description:  获取启动参数
  Input:        - pBootParam: 启动参数
  Output:       无
  Return:       字符串
  Others:       无
*******************************************************************************/ 
int CFG_GetBootParam(CFG_bootpara_t *pBootParam);

/*******************************************************************************
  Function:     CFG_Exit
  Description:  配置模块注销
  Input:        无
  Input:        无
  Output:       无
  Return:       无
  Others:       无
*******************************************************************************/
void CFG_Exit(void);

/*******************************************************************************
  Function:     CFG_GetBomPid
  Description:  获取BOMPID
  Input:        无
  Output:       - pBompid: bompid
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/
int CFG_GetBomPid(char *pBompid);

/*******************************************************************************
  Function:     CFG_SetBomPid
  Description:  设置BOMPID
  Input:        - pBompid: bompid
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/
int CFG_SetBomPid(char *pBompid);

/*******************************************************************************
  Function:     CFG_DelBomPid
  Description:  删除BOMPID信息
  Input:        无
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/
int CFG_DelBomPid(void);

/*******************************************************************************
  Function:     CFG_GetSpecialItem 
  Description:  获取定制化配置项
  Input:        - name: 定制化配置项名
  Output:       无
  Return:       NULL: 操作失败
                ~NULL: 获取的配置项 
  Others:       无
*******************************************************************************/
cJSON *CFG_GetSpecialItem(char *pName);

/*******************************************************************************
  Function:     CFG_SetSpecialItem 
  Description:  设置定制化配置项
  Input:        - name: 定制化配置项名
                - pJson: 定制化配置项
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/
int CFG_SetSpecialItem(char *pName, cJSON *pJson);

/*******************************************************************************
  Function:     CFG_DelSpecialItem 
  Description:  删除定制化配置项
  Input:        - name: 定制化配置项名
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/
int CFG_DelSpecialItem(char *pName);

/*******************************************************************************
  Function:     CFG_ModifyItemTmp 
  Description:  临时修改配置
  Input:        - name: 定制化配置项名
                - pJson: 定制化配置项, NULL:删除配置
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/
int CFG_ModifyItemTmp(char *pName, cJSON *pJson);

/*******************************************************************************
  Function:     CFG_SetProductItem 
  Description:  设置生产信息配置项名
  Input:        - name: 生产信息配置项名
                - pJson: 生产信息配置项
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/
int CFG_SetProductItem(char *pName, cJSON *pJson);

/*******************************************************************************
  Function:     CFG_DelProductItem 
  Description:  删除生产信息配置项
  Input:        - name: 生产信息配置项名
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/
int CFG_DelProductItem(char *pName);

/*******************************************************************************
  Function:     CFG_EncryptionSet
  Description:  配置加密信息
  Input:        无
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/
int CFG_EncryptionSet(void);

/*******************************************************************************
  Function:     CFG_ParseFile
  Description:  解析配置文件
  Input:        - pFilePath: 配置文件路径
  Output:       无
  Return:       !NULL: json配置
                NULL: 操作失败
  Others:       无
*******************************************************************************/ 
cJSON *CFG_ParseFile(char *pFilePath);


#endif /* __KERNEL__ */


#ifdef __HuaweiLite__
/*******************************************************************************
  Function:     CFG_InitProduction
  Description:  设备级配置初始化
  Input:        无
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/ 
int CFG_InitProduction(void);

#endif /* __HuaweiLite__ */


#ifdef __cplusplus
}
#endif
#endif /* CFG_H */

